#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <string>
#include<time.h>
#define NUM 10

using namespace std;

//可以用类来实现线程
class ThreadData
{
public:
    ThreadData(string name,int id,time_t createTime)
    :_name(name),_id(id),_createTime((uint64_t)createTime)
    {}
    ~ThreadData()
    {}
public:
    string _name;
    int _id;
    uint64_t _createTime;
};



// 线程终止
// 1.线程函数执行完毕
// 2.pthread_exit
void *thread_run(void *args) // 这是一个可重入函数，每个线程都进入该函数执行了
{
    char *name = (char *)args;
    while (true)
    {
        cout << "new thread running, my thread id : " << name << endl;
        sleep(1);
        break;
        // exit(10);//这是进程退出，而不是线程退出。只要有任何一个线程调用，整个进程全部退出
    }
    delete name;
    // return nullptr;//线程函数执行完毕，线程终止
    pthread_exit((void *)1); // 返回线程退出时的结果，相当于void* ret=(void*)1
}

int main()
{

    pthread_t tids[NUM];
    for (int i = 0; i < NUM; i++)
    {
        char *tname = new char[64]; // 每个线程都是一个缓冲区
        // char tname[64];//缓冲区由多个线程共享，每个线程都指向同一个缓冲区
        snprintf(tname, 64, "thread-%d", i + 1);
        pthread_create(tids + i, nullptr, thread_run, tname);
        //采用对象的方式创建线程
        // ThreadData* td=new ThreadData(tname,i,time(nullptr));
        // pthread_create(tids + i, nullptr, thread_run, td);
        sleep(1);
    }
    void *ret = nullptr; // 用于接收pthread_join的输出型参数
    for (int i = 0; i < NUM; i++)
    {
        int n = pthread_join(tids[i], &ret); // 线程等待
        //为什么线程返回什么就获取什么？为什么不处理异常呢？
        //如果线程出现异常，整个进程都会结束。因此不需要考虑异常
        if (n != 0)
            cerr << "pthread_join error" << endl;
        cout << "thread quit:" << (uint64_t)ret << endl;//将ret从void*强转为整型
    }

    // while (true)
    // {
    //     cout << "main thread running, new thread id : " << endl;
    //     sleep(1);
    // }
    return 0;
}